package cn.rxyb.core.random;

import cn.rxyb.core.calculate.DoubleCalculate;

import java.math.RoundingMode;

/**
 * @author YJH
 * @version 1.0
 * @description double 随机数生成
 * @date 2020/6/26 15:07
 */
public class DoubleRandom implements IRandom {


    private static DoubleRandom instance = null;

    private DoubleRandom() {
    }

    public static DoubleRandom getInstance() {
        if (null == instance) {
            instance = new DoubleRandom();
        }
        return instance;
    }


    /**
     * 获得随机数
     *
     * @return 随机数
     * @since 3.3.0
     */
    public double random() {
        return this.getRandom().nextDouble();
    }

    /**
     * 获得指定范围内的随机数 [0,limit)
     *
     * @param limit 限制随机数的范围，不包括这个数
     * @return 随机数
     */
    public double random(double limit) {
        return this.getRandom().nextDouble(limit);
    }

    /**
     * 获得指定范围内的随机数
     *
     * @param min 最小数（包含）
     * @param max 最大数（不包含）
     * @return 随机数
     * @since 3.3.0
     */
    public double random(double min, double max) {
        return this.getRandom().nextDouble(min, max);
    }

    /**
     * 获得指定范围内的随机数
     *
     * @param min   最小数（包含）
     * @param max   最大数（不包含）
     * @param scale 保留几位小数点
     * @return 随机数
     * @since 3.3.0
     */
    public double random(double min, double max, int scale) {
        return DoubleCalculate.getInstance().scale(this.getRandom().nextDouble(min, max), scale);
    }


    /**
     * 获得指定范围内的随机数
     *
     * @param min          最小数（包含）
     * @param max          最大数（不包含）
     * @param scale        保留几位小数点
     * @param roundingMode 保留小数的模式
     * @return 随机数
     * @since 3.3.0
     */
    public double random(double min, double max, int scale, RoundingMode roundingMode) {
        return DoubleCalculate.getInstance().scale(this.getRandom().nextDouble(min, max), scale, roundingMode);
    }

}
